/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controle;

import Modelo.Tokens;
import java.util.LinkedList;

/**
 *
 * @author heitor.faccioni & julian & bronha
 */
public class SeparaTokens 
{

    /**
     *
     * @param TodoCodigo Todo o código fonte de entrada.
     * @return Retorna os tokens gerados.
     */
    public static LinkedList<Tokens> Split(String TodoCodigo) {
        
        LinkedList<Tokens> ListaDeTokens = new LinkedList();//Lista de retorno
        int lenght = TodoCodigo.length(),linha=1;
        char caractere; //caractere que sera analizado
        String tmp = ""; //String que guarda os valores de caracteres lidos
        boolean aspas = false;
        //O for para percorrer todo a string de codigo
        for (int i = 0; i < lenght; i++) {
            //Pega a letra da posicao i
            caractere = TodoCodigo.charAt(i);
            if (aspas) {
                //Testa o fim da string
                if (caractere == '\"') {
                    tmp += caractere;
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                    aspas = false;
                } else {
                    tmp += caractere;
                }
            } else //Começo de uma "string"
            if (caractere == '\"') {
                aspas = true;
                //caso tenha algo na strig
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                }
                tmp = "\"";
            } else if (caractere == ' ' || caractere == '\t') { //Testa para espaço
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }
            } else if (caractere == '\n') { //Testa para quebra de linha
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }
            } else if (caractere == ',') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }
                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);  
            } else if ((caractere == '=') || (caractere == '!') || (caractere == '<') || (caractere == '>')) 
            {
                if (!"".equals(tmp))
                {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }
                try
                {
                    if (TodoCodigo.charAt(i+1) == '=')
                    {
                        tmp = caractere + "";
                        caractere = TodoCodigo.charAt(i+1);
                        tmp += caractere;
                        Tokens token = new Tokens(tmp, linha); 
                        ListaDeTokens.add(token);
                        tmp = "";
                        i++;
                    }
                    else
                    {
                        Tokens token = new Tokens(caractere, linha); 
                        ListaDeTokens.add(token);  
                    }
                } catch (StringIndexOutOfBoundsException x) {}
            } else if (caractere == ';') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }
                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);  
            } else if (caractere == '(') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }

                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);  
             } else if (caractere == ')') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }

                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);     
             
             } else if (caractere == '+') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }

                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);  
//             } else if (caractere == '-') {
//                //caso tenha algo a guardar
//                if (tmp.compareTo("") != 0) {
//                    Tokens token = new Tokens(tmp, linha); 
//                    ListaDeTokens.add(token);
//                    tmp = "";
//                }
//
//                Tokens token = new Tokens(caractere + "", linha); 
//                ListaDeTokens.add(token);      
             } else if (caractere == '*') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }

                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);     
             } else if (caractere == '/') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }

                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);    
                
             } else if (caractere == '^') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }

                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);    
                
             } else if (caractere == '%') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }

                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);      
             } else if (caractere == '{') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }

                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);  
             } else if (caractere == '}') {
                //caso tenha algo a guardar
                if (tmp.compareTo("") != 0) {
                    Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
                    tmp = "";
                }
                Tokens token = new Tokens(caractere + "", linha); 
                ListaDeTokens.add(token);   
             } else {
                tmp += caractere;
            }
            
            if(caractere=='\n'){
                linha++;
            }
        }
        if (tmp.compareTo("") != 0) {
            Tokens token = new Tokens(tmp, linha); 
                    ListaDeTokens.add(token);
        }
        for(int i=0; i<ListaDeTokens.size(); i++)
        {
            if(ListaDeTokens.get(i).getLexema().equals(""))
            {
                ListaDeTokens.remove(i);
                i--;
            }
        }
        return ListaDeTokens;
    }
}
